OOP
( Objektorientiertes Programmieren )
# class · object · __init__ · self · inheritance · polymorphism
class User:
def __init__(self, name):
self.name = name
def say_hi(self):
print(f"Hi, ich bin {{"{self.name}"}}!")
u1 = User("Bastian")
u1.say_hi() # → Hi, ich bin Bastian!
Was bedeutet Objektorientierung?
OOP (Objektorientierte Programmierung) bedeutet: Du modellierst deinen Code wie die echte Welt. Statt nur Funktionen und Variablen zu verteilen, packst du Daten (Attribute) und Funktionen (Methoden) in eine gemeinsame Einheit: ein Objekt.
class & Instanzen
Eine Klasse definierst du mit class.
Ein Objekt entsteht, wenn du die Klasse „aufrufst“ wie eine Funktion.
MeineKlasse).__init__ (Konstruktor)
Wenn du ein Objekt erzeugst, kann Python automatisch eine Start-Logik ausführen:
__init__.
Hier setzt du häufig Startwerte (Attribute).
self ist Pflicht als erster Parameter in Methoden.
Er zeigt auf das aktuelle Objekt, damit du auf Attribute wie self.name zugreifen kannst.
Instanzattribute vs. Klassenattribute
Instanzattribute gehören zu einem bestimmten Objekt. Klassenattribute gehören zur Klasse selbst und werden von allen Instanzen geteilt.
__init__ über self gesetzt.def __init__(self, name):
self.name = name
self.plattform = "HelloPython.de"
def __init__(self, name):
self.name = name
Methoden & self
Methoden sind Funktionen innerhalb einer Klasse. Der wichtigste Punkt: Der erste Parameter ist fast immer
self.
self.Kapselung & Properties
Kapselung bedeutet: Du schützt interne Daten, damit sie nicht „wild“ verändert werden.
In Python gibt es kein echtes private wie in Java – aber es gibt Konventionen:
_name (intern) und
__name (Name Mangling).
Für kontrollierten Zugriff nutzt man oft @property.
Vererbung (Inheritance)
Vererbung bedeutet: Eine Klasse kann Eigenschaften/Methoden von einer anderen Klasse übernehmen. Die „Kindklasse“ erweitert oder überschreibt das Verhalten der „Elternklasse“.
super().__init__(...) in der Kindklasse.
Gleiches Interface, unterschiedliches Verhalten
Polymorphismus bedeutet: Verschiedene Objekte können dieselbe Methode besitzen, aber unterschiedlich reagieren.
Im Beispiel oben haben Hund und Katze beide
sound() – aber mit unterschiedlichem Ergebnis.
Komposition statt Vererbung
Komposition bedeutet: Ein Objekt besteht aus anderen Objekten. Oft ist das flexibler als Vererbung ("has-a" statt "is-a").
@classmethod & @staticmethod
Neben normalen Methoden gibt es: @classmethod (arbeitet mit der Klasse selbst) und @staticmethod (wie eine Funktion, aber logisch in der Klasse gruppiert).
cls (die Klasse). Praktisch für alternative Konstruktoren.def __init__(self, name):
self.name = name
@classmethod
def guest(cls):
return cls("Gast")
self und kein cls. Gut für kleine Hilfsfunktionen.@staticmethod
def is_even(n):
return n % 2 == 0
Dunder-Methoden ("__...__")
Dunder-Methoden (double underscore) geben deinen Objekten „Superkräfte“.
Damit funktionieren Dinge wie print(obj) oder len(obj).
| Methode | Wann wird sie genutzt? | Beispiel |
|---|---|---|
__str__ |
Bei print(obj) / str(obj) |
return "User: ..." |
__repr__ |
Debug-Ansicht (z.B. in Listen) | return "User(name=...)" |
__len__ |
Bei len(obj) |
return len(self.items) |
__add__ |
Bei a + b |
return ... |
__eq__ |
Bei a == b |
return self.id == other.id |
Mini-Projekt: Aufgabenliste als Klasse
Ein kleines Projekt, das du direkt in VS Code ausprobieren kannst: Eine ToDo-Liste mit Tasks. Dabei übst du: Klassen, Listen, Methoden, Dunder und saubere Struktur.
save_to_file() und speichere die Tasks in eine Textdatei.
Nice! Du hast die wichtigsten OOP-Bausteine verstanden. Als nächstes passen perfekt: Fehlerbehandlung (try/except) und Module & Pakete.